var obj = new Proxy({}, {
    get: function (target, key, recriver) {
        console.log(`getting${key}`);
        return Reflect.get(target, key, recriver);
    },
    set: function (target, key, value, receiver) {
        console.log(`setting ${key}!`);
        return Reflect.set(target, key, value, receiver);
    }
});

// obj.count = 1;//setting count!
// ++obj.count;//gettingcount,setting count!


// 文章来源于https://www.jdon.com/idea/js/es6-proxies.html 

/*
  * 在es6中,proxy构造器是一种可访问的全局对象,使用它,你可以在对象与各个操作对象的行为之间收集有关的请求操作的各种信息,并返回任何你想做的.
  * 在这一点,代理proxy与中间件有很多的共同点,也就是说proxy会代理你要操作的对象,那为什么要代理原对象呢?
  * 
  * Proxy代理能够让你截取原对象的各种操作和方法,最普遍的是get  set  apply和construct等方法,看这个规定有很多被连接的方法,Proxy代理也能配置
  * 为任何时候停止拦截请求,有效的撤销他们所服务的对象的所有访问代理,这是通过revoke方法实现的
  * 
  * 首先解释一下代理中使用到的技术名词：
  * 
  * target是指代理的原对象，它是你需要拦截访问的原始对象，它总是作为Proxy构造器的第一个方法，也可以传递到每个trap中。
  * handler是一个包含你要进行拦截和处理的对象，也就是你拦截了原始对象以后想干什么？主要的代理内容在这里，是作为Proxy构造器的第二个方法参数传统，它是实现Proxy API。
  * trap用来规定对于指定什么方法进行拦截处理，如果你想拦截get方法的调用，那么你要定义一个get trap。
  *
*/

// 基本用法

let dataStore = {
    name: 'Billy Bob',
    age: 15,
};
let handler = {
    get(target,key,proxy){
        // get的trap拦截get方法
        const today = new Date();
        console.log(`GET request made for ${key} at ${today}`);
        return Reflect.get(target,key,proxy);//拦截get方法
    }
}
// 构造一个代理,第一个参数是原始对象,第二个参数是代理处理器
dataStore = new Proxy(dataStore,handler);
// 这里将会执行我们的handler, 记录请求，设置name值。
const name = dataStore.name; 
